package flare.query
{
  /**
   * Utility class providing functions for manipulating <code>Date</code>
   * objects. These functions are intended for use by the
   * <code>Fn</code> operator.
   */
  public class DateUtil
  {

    // ADDDATE()(v4.1.1) 	Add dates
    // ADDTIME()(v4.1.1) 	Add time
    // CONVERT_TZ()(v4.1.3) 	Convert from one timezone to another
    // CURDATE() 	Return the current date
    // CURRENT_DATE(), CURRENT_DATE 	Synonyms for CURDATE()
    // CURRENT_TIME(), CURRENT_TIME 	Synonyms for CURTIME()
    // CURTIME() 	Return the current time
    // DATE_ADD() 	Add two dates
    // DATE_FORMAT() 	Format date as specified
    // DATE_SUB() 	Subtract two dates
    // DATE()(v4.1.1) 	Extract the date part of a date or datetime expression
    public static function date(d:Date):Date
    {
      return new Date(d.toLocaleDateString());
    }

    // DATEDIFF()(v4.1.1) 	Subtract two dates

    // DAYNAME()(v4.1.21) 	Return the name of the weekday

    // DAYOFMONTH() 	Return the day of the month (1-31)
    // DAY()(v4.1.1) 	Synonym for DAYOFMONTH()
    public static function day(d:Date):int
    {
      return d.date;
    }

    // DAYOFWEEK() 	Return the weekday index of the argument
    // WEEKDAY() 	Return the weekday index
    public static function dayOfWeek(d:Date):int
    {
      return d.day;
    }

    // DAYOFYEAR() 	Return the day of the year (1-366)
    // EXTRACT 	Extract part of a date
    // FROM_DAYS() 	Convert a day number to a date
    // FROM_UNIXTIME() 	Format date as a UNIX timestamp
    // GET_FORMAT()(v4.1.1) 	Return a date format string

    // HOUR() 	Extract the hour
    public static function hour(d:Date):int
    {
      return d.hours;
    }

    // LAST_DAY(v4.1.1) 	Return the last day of the month for the argument
    // MAKEDATE()(v4.1.1) 	Create a date from the year and day of year
    // MAKETIME(v4.1.1) 	MAKETIME()

    // MICROSECOND()(v4.1.1) 	Return the microseconds from argument
    public static function microsecond(d:Date):int
    {
      return int(1000 * d.time) % 1000000;
    }

    // MINUTE() 	Return the minute from the argument
    public static function minute(d:Date):int
    {
      return d.minutes;
    }

    // MONTH() 	Return the month from the date passed
    public static function month(d:Date):int
    {
      return d.month;
    }

    // MONTHNAME()(v4.1.21) 	Return the name of the month

    // NOW() 	Return the current date and time
    // LOCALTIME(), LOCALTIME 	Synonym for NOW()
    // LOCALTIMESTAMP, LOCALTIMESTAMP()(v4.0.6) 	Synonym for NOW()
    // CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP 	Synonyms for NOW()
    public static function now():Date
    {
      return new Date();
    }

    // PERIOD_ADD() 	Add a period to a year-month
    // PERIOD_DIFF() 	Return the number of months between periods
    // QUARTER() 	Return the quarter from a date argument
    // SEC_TO_TIME() 	Converts seconds to 'HH:MM:SS' format

    // SECOND() 	Return the second (0-59)
    public static function second(d:Date):int
    {
      return d.seconds;
    }

// STR_TO_DATE()(v4.1.1) 	Convert a string to a date
// SUBDATE() 	When invoked with three arguments a synonym for DATE_SUB()
// SUBTIME()(v4.1.1) 	Subtract times
// SYSDATE() 	Return the time at which the function executes
// TIME_FORMAT() 	Format as time
// TIME_TO_SEC() 	Return the argument converted to seconds
// TIME()(v4.1.1) 	Extract the time portion of the expression passed
// TIMEDIFF()(v4.1.1) 	Subtract time
// TIMESTAMP()(v4.1.1) 	With a single argument, this function returns the date or datetime expression. With two arguments, the sum of the arguments
// TIMESTAMPADD()(v5.0.0) 	Add an interval to a datetime expression
// TIMESTAMPDIFF()(v5.0.0) 	Subtract an interval from a datetime expression
// TO_DAYS() 	Return the date argument converted to days
// UNIX_TIMESTAMP() 	Return a UNIX timestamp
// TC_DATE()(v4.1.1) 	Return the current UTC date
// UTC_TIME()(v4.1.1) 	Return the current UTC time
// UTC_TIMESTAMP()(v4.1.1) 	Return the current UTC date and time
// WEEK() 	Return the week number
// WEEKOFYEAR()(v4.1.1) 	Return the calendar week of the date (1-53)

// YEAR() 	Return the year
    public static function year(d:Date):int
    {
      return d.fullYear;
    }

  // YEARWEEK() 	Return the year and week

  } // end of class DateUtil
}